{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**通用最佳实践回顾**\n",
    "\n",
    "- `std::priority_queue<T, Container, Compare>` 是堆适配器，默认使用 `std::vector<T>` 和 `std::less<T>` 构造最大堆；如需最小堆或自定义排序，需提供比较器（如 `std::greater<T>` 或自定义仿函数/ lambda）。\n",
    "- 仅暴露堆顶相关接口（`top`、`push`、`emplace`、`pop`、`empty`、`size`），无遍历能力；若需遍历或修改任意元素，考虑直接操作底层容器并调用 `std::make_heap` / `push_heap` / `pop_heap`。\n",
    "- `std::priority_queue` 无法减少元素优先级；若需支持“decrease-key”或“update-key”操作，通常需重新插入修改后的元素、标记旧元素无效，或使用可更新的替代结构（`std::multiset`、`boost::heap::fibonacci_heap` 等）。\n",
    "- 默认比较器与容器类型作为模板参数存储在实例内，建议使用 `struct` 仿函数或无状态 lambda（C++20 起支持模板参数 lambda）以避免潜在复制成本。\n",
    "- 性能敏感场景应优先使用 `emplace` 构造，以减少对象拷贝；如需要稳定地频繁提取最小值（如 Dijkstra），推荐定义最小堆。\n",
    "- `top()` 返回 const reference；在调用 `pop()` 前应先读取所需数据。调用 `pop()` 前需确保队列非空。\n",
    "- 多线程场景下需额外同步；`std::priority_queue` 不提供并发安全性。对实时任务队列可考虑无锁结构或分段锁策略。\n",
    "- 插入大量数据之前可调用 `Container::reserve`（若底层容器为 `std::vector`）以减少扩容次数，提高效率。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| 序号 | 工程场景                        | 文件名                              | 说明要点                                                     | 可运行示例代码            |\n",
    "| ---- | ------------------------------- | ----------------------------------- | ------------------------------------------------------------ | ------------------------- |\n",
    "| 1    | 图最短路径 / Dijkstra           | `priority_queue_dijkstra.cpp`       | 使用最小堆提取当前最短路径节点；演示自定义比较器、`emplace`、懒惰删除重复条目。 | 示例 1：Dijkstra 最短路径 |\n",
    "| 2    | 任务调度 / 延迟队列             | `priority_queue_task_scheduler.cpp` | 根据优先级与时间戳调度任务；展示结构体比较器及批量出队执行。 | 示例 2：任务优先级调度    |\n",
    "| 3    | 流式 Top-K 统计                 | `priority_queue_topk_stream.cpp`    | 维护固定容量的最小堆以保留最大 K 个元素；演示 `std::greater<>` 创建最小堆。 | 示例 3：流式 Top-K        |\n",
    "| 4    | 多路有序序列合并（K-way merge） | `priority_queue_merge_k_sorted.cpp` | 利用最小堆合并多个有序数组；通过索引跟踪来源序列实现逐步输出。 | 示例 4：多路合并有序输出  |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 示例 1：Dijkstra 最短路径（priority_queue_dijkstra.cpp）\n",
    "- 示例 2：任务优先级调度（priority_queue_task_scheduler.cpp）\n",
    "- 示例 3：流式 Top-K（priority_queue_topk_stream.cpp）\n",
    "- 示例 4：多路合并有序输出（priority_queue_merge_k_sorted.cpp）"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
